package org.persistente.manipula.mapeamento;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.persistente.manipula.conexao.ConexaoBD;

/**
 * Manipulador específico para Firebird.
 * @param <T> Tipoda entidade a ser manipulada.
 */
public class ManipuladorReturning<T> extends Manipulador<T> {

    public ManipuladorReturning(MapaObjetoRelacional mapa) {
        super(mapa);
    }

    public ManipuladorReturning(MapaObjetoRelacional mapa, Connection con) {
        super(mapa, con);
    }

    /**
     * Insere a entidade no banco de dados, e preenhce as chaves geradas automaticamente pelo banco.
     * Funciona apenas para PostgreSQL e FireBird.
     * @param entidade Entidade a ser inserida
     */
    @Override
    public void insereRetornando(T entidade) {
        Connection con = getConexao();
        PreparedStatement st = null;
        ResultSet rs = null;
        try {
            List<CampoAbstrato> modificados = getModificados(entidade);
            List<CampoAbstrato> retorno = getChaves();
            String sql = GeradorSql.insereRetornando(getNomeEntidade(), modificados, retorno);
            st = con.prepareStatement(sql);
            setParametros(st, 1, entidade, modificados);
            rs = st.executeQuery();
            rs.next();
            preencheEntidade(rs, entidade, retorno);
        } catch (SQLException e) {
            throw ConexaoBD.novaExcecao(e);
        } finally {
            ConexaoBD.fecha(rs);
            ConexaoBD.fecha(st);
            fecha(con);
        }
    }
}
